{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 问题：python2 和 python3 有哪些区别\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "面试官想从这道题中考察面试人什么？\n",
    "实际上，现在还有很多公司在继续使用 Python2，也有可能在转 Python3 的路上。加上，Python2 上的 feature 已经不再继续支持了，Python2 终有一天会被 Python3 替代。所以，知道这两个版本的区别有时候是必要的，特别是如果你要面试的公司还在使用 Python2，那么，被问到这个问题的可能性非常大。你要知道，如果一个公司仍在 Python2 上开发的项目，应该尽量使用可以向后兼容的句法，这样可以减少以后的维护工作。\n",
    "\n",
    "答案\n",
    "print\n",
    "print 语句没有了，取而代之的是 print () 函数。\n",
    "Unicode\n",
    "Python2 有 ASCII str () 类型，unicode () 是单独的，不是 byte 类型。\n",
    "在 Python 3，我们最终有了 Unicode (utf-8) 字符串，以及一个字节类：byte 和 bytearrays。\n",
    "除法运算\n",
    "Python2 中的整数相除的结果是一个整数，比如 1 / 2 得到的是 0。\n",
    "Python3 中的整数相除的结果是一个浮点数，如果你想得到一个整数，可以使用 floor 除法，像这样 1 // 2。\n",
    "xrange\n",
    "Python2 中，用 xrange 返回类似于迭代器的对象，这要比 range 要快很多，它是惰性求值，而不是一次性求值。\n",
    "Python3 已经去掉了 xrange，因为 Python3 的 range 就是 Python2 的 xrange，所以就没有再保留 xrange。\n",
    "不等运算符\n",
    "Python 2.x 中不等于有两种写法！= 和 <>。\n",
    "Python 3.x 中去掉了 <>, 只有！= 一种写法。\n",
    "repr 表达式\n",
    "Python 2.x 中反引号 ` ` 相当于 repr 函数的作用。\n",
    "Python 3.x 中去掉了 ` ` 这种写法，只允许使用 repr 函数。\n",
    "long 类型\n",
    "Python 3.x 去除了 long 类型，现在只有一种整型 int。\n",
    "高阶函数\n",
    "Python 3.x 高阶函数 map、filter、zip 返回的是迭代器，不是列表对象了，而 reduce 也不再是内建函数了。\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 问题：python 中的异常处理，写一个简单的应用场景\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "面试官想从这道题中考察面试人什么？\n",
    "Python 作为一门动态语言，很多错误都是在运行时暴露出来。为了维护程序的鲁棒性 (即系统健壮性)，Python 可以在 try-except 的帮助下去进行一些异常处理方法。这个问题主要看看大家对 try 语句的使用。当然，面试官可能也会给你模拟一些场景，然后让你去加一些异常处理。\n",
    "\n",
    "答案\n",
    "def AbyB(a, b):\n",
    "    try:\n",
    "        c = ((a+b) / (a-b))\n",
    "    except ZeroDivisionError:\n",
    "        print \"a/b result in 0\"\n",
    "    else:\n",
    "        print c\n",
    "拓展\n",
    "这道题的答案并不是唯一的，大家可以临场发挥。但是基本的 try-except 的格式应该熟记于心。\n",
    "\n",
    "try-except 完整版的格式：\n",
    "\n",
    "try:\n",
    "    do_something # 这个执行过程可能会raise错误\n",
    "except Exception:\n",
    "    handle_exception_error # 捕获到异常后的处理\n",
    "else:\n",
    "    handle_non_exception # 未捕获到异常后的处理\n",
    "finally:\n",
    "    cleanup # 无论异常发生与否，都会执行这部分\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 小结"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2.4、2.5、2.6、2.7 这几个小节，我花了很多篇幅在 super 函数和 yield 用法的问题上，要让大家彻底理解这两个东西还是非常有必要的，我希望大家不光能轻松应付面试，也能写出漂亮高效的代码。而另外三个问题，自省函数，异常处理和 Python2 和 3 的一些区别，都属于基本常识问题，大家心里有个数就行，等到面试之前多花点时间熟记一下。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}